Все есть файл
Введение Перед тем как перейти к чтению следующих глав, вы должны понять философию ОС Inferno, которая базируется на идее "Всё есть файл". Любой ресурс, предоставляемый операционной системой любому приложению является файлом. Мышь - это файл, экран - файл, видеодаптер - опять файл, сетевое соединение - снова файл. Inferno построена из кирпичиков под названием файл и это особенность дает ей ряд приемуществ, включая сетевую прозрачность, цельность, компактность и просту. В следующих разделах мы рассмотрим три ключевые компонента модели "Всё есть файл". Протокол Styx Коммуникационный протокол Styx (P9 в Plan9) - центральная часть операционной системы Inferno. Все без исключения приложения операционной системы получают доступ к файлам (как локальным, так и удаленным) с его помощью. Протокол Styx является той самой средой, по которой передаются запросы на открытие, чтение и запись файлов. Тот факт, что приложение, пославшее запрос на открытие файла, передает этот запрос в дальнейшем протоколу Styx, и делает возможным перенаправлять приходящие запросы как внутри локальной системы, так и обращаться к удаленным машинам. При этом, для приложения удаленные ресурсы выглядят в точности аналогично локальным. Файловые серверы Файловые серверы представляют собой специальные программы, экспортирующие собственные ресурсы (в виде файлов) по протоколу Styx. Любая другая программа или пользователь может обратиться к этим файлам для получения управления над файловым сервером или использования его возможностей. В Inferno файловые серверы везде: это и драйвера, и файловые системы, и оконный интерфейс, и все что угодно. В идеале, любая программа для ОС Inferno, не носящая утилитарный характер, должна быть файловым сервером. Хороший пример файлового сервера - сервер соединений cs(8), экспортирующий всего один файл - /net/cs. Его задача - преобразовывать символьные имена удаленных машин и сервисов в инструкции для подключения к этим машинам и сервисам. Сервер соединений должен быть запущен в любой копии Inferno, предназначенной для сетевого взаимодействия. Выполните команду ndb/cs, а затем просмотрите список файлов каталога /net: > ls /net Вы должны увидеть файл /net/cs в выводе: /net/cs /net/ndb /net/tcp /net/udp Теперь выполните команду ndb/csquery и укажите ей какой-либо адрес: ndb/csquery > net!$signer!inflogin /net/tcp/clone 200.1.1.67!6673 Последняя строка - это и есть инструкция на подключение к серверу $signer (которую мы разберем в следующем подразделе). Драйвера Драйвера устройств в Inferno также представляют собой файловые серверы, единственное отличие которых в том, что они работают в режиме ядра. Обычно драйвера экспортируют ресурсы низлежащего оборудования в виде файлов каталога /dev, но это скорее закономерность, чем требование. Например, драйвер сетевого стека ip(3) экспортирует ресурсы в виде файлов каталога /net, обращаясь к которым можно создать или завершить соединение или получать данные от удаленного узла. Поэтому строка: /net/tcp/clone 200.1.1.67!6673 из предыдущего раздела, это ничто иное как инструкция о том, что нужно сделать с файлами каталога /net для создания нового подключения к серверу 200.1.1.67 ($signer) и порту 6673 (inflogin), а именно: открыть файл /net/tcp/clone и записать в него строку 200.1.1.67!6673. Все присутствующие в системе драйвера устройств перечислены в 3-й секции man-страниц и каждому из них соответствует специальный индекс, стостоящий из знака # и символа (например #I - это устройство ip, то есть сетевой стек, а #m - устройство-указатель, в большинсве случаев мышь). Индекс нужен для идентификации устройства в системе и подключения его ресурсов (файлов) к существующему файловому дереву. Пространство имен В отличие от других ОС, Inferno следует идее обособленных пространств имен для каждого процесса и пользователя. Это значит, что структура видной приложениям (а следовательно и пользователям) файловой системы никогда не бывает статической и может изменяться во времени, причем изменения, произведенные одним приложением/пользователем не отражаются на пространстве имен другого приложения/пользователя. По самой своей сути пространство имен есть ни что иное, как растущее из корня файловое дерево, к каждой ветви (каталогу) которого в любое время можно подключить новый набор каталогов и файлов, экпортируемых (по протоколу Styx) драйверами, файловыми серверами или удаленными машинами. : Важно понимать, что это файловое дерево и есть единственный путь взаимодействия пользователя/приложения с операционной системой Inferno. Оно может (и должно) хранить необходимые пользователю приложения, личные данные пользователей, файлы, предоставлющие доступ к ресурсам ОС, ПК и приложений. Являясь деревом, пространство имен полностью подчиняется идее постоянного роста. Сразу после старта ОС пространство имен системного пользователя eve имеет лишь корень (так называемый корневой каталог /). Чтобы пользователь смог работать с ОС, ядро (на последнем этапе инициализации) создает так называемое начальное пространство имен. Для этого к корню файловой системы подключается псевдо-стройство "#/", драйвер которого экспортирует минимально необходимый набор каталогов и утилит командной строки (смотрите root(3)). Далее к корню подключается псевдо-устройство "#U" (fs(3)), в результате чего в пространстве имен появляется содержимое каталога, указанного в переменной $EMUROOT низлежащей ОС. Затем последовательно подключаюся другие псевдо-устройства: # консоль "#c" (cons(3)) к каталогу /dev (файлы cons, keyboard, pointer и другие, все они нужны для того, чтобы пользователь смог взаимодействать с ОС), # виртуальная файловая система "#p" (prog(3)) к /prog (набор специальных каталогов, по одному на каждый процесс, нужны для управления процессами), # TCP/IP-стек "#I" (ip(3)) к /net (каталоги tcp, udp и другие) и # окружение исполнения "#e" (env(3)) к /env (по файлу на каждую переменную окружения). В результате пространство имен пользователя eve оказывается наполненным всем необходимым для работы с операционной системой в режиме командной строки. Отныне он имеет доступ к приложениям, расположенным в каталоге /dis (их экспортирует драйвер псевдо-устройства "#U"), может работать с командной строкой (драйвер устройства "#c" экспортирует файл keyboard), может запускать и завершать приложения (балгодаря файлам, экспортруемым драйвером "#p"), имеет доступ к сети (драйвер "#I") и может изменять переменные окружения (драйвер "#e"). Далее пользователь может запустить менеджер окон wm/wm, который подключит к каталогу /dev псевдо-устройство "#i", драйвер которого экспортирует каталог draw, необходимый для работы с графикой, и пользуясь его возможностями, создаст графический интерфейс. :// TODO: вставить этот пример: perky$ cd /tmp; pwd expected effect /tmp perky$ echo 'cd /; pwd' > root perky$ sh root; pwd / cd applies to script's shell /tmp ...but not to toplevel shell Приведенная последовательность может быть несколько иной в завивсимости от типа низлежащей ОС или факта запуска ОС на голом железе. В любом случае, последовательность команд, нужная для формирования этого пространства имен будет выглядеть так: bind '#/' / bind -ac '#U' / bind -b '#c' /dev bind '#p' /prog bind -a '#I' /net bind -c '#e' /env Обычно команда bind используется для подключения содержимого уже существующего в текущем пространстве имен каталога к другому каталогу (например, вы можете создать каталог /dev2 и выполнить команду "bind /dev /dev2", которая создаст копию (а точнее зеркальное отражение) файлов каталога /dev в каталоге /dev2). Но bind также применяется для подключения файлов, экспортируемых драйверами устройств. :// TODO bind source target source covers target; a reference to target subsequently finds source. Roughly similar to a symbolic link. bind -a source target source and target form a union directory; a reference to target subsequently finds both directories, where the content of source appears after that of target. bind -b source target source and target form a union directory; a reference to target subsequently finds both directories, where the content of source appears before that of target. -c additionally permits creation of files in the union directory. A new file name is entered into the first directory within a union where creation is possible. :// TODO // TODO Mount introduces an external file tree into the namespace, just as it does on unix systems. The file tree is accessed by talking the styx protocol over a file descriptor. The kernel takes care of the styx-part by translating open/read/write/stat/etc system calls into styx messages (the messages are described in section 5 of the manual pages), and the response messages into return values. The mount system call expects a file descriptor to talk styx over. The mount program has convenient syntax for mounting three types of styx servers: mount /path/to/styx/file target, gets file descriptor by opening /path/to/styx/file mount {program} target, starts program and uses its stdin as file descriptor : Причина использования команды bind для подключения файлов, экспортируемых драйверами устройств, кроется в том, что согласно внутренним механизмам работы Inferno, эти файлы уже существуют в пространстве имен (они появляются во время инициализации драйвера), но до фактического вызова bind к ним невозможно получить доступ. Именно для этого были придуманы инексы. : ''Вы можете убедится в этом просмотрев листинг файлов, экпортируемых любым из описанных выше драйверов устройств: : // TODO: разобрать это все perky$ ls -q '#/' root, inplicitly bound to / 80000004.00000000 #/chan 80000001.00000000 #/dev 80000003.00000000 #/net 80000005.00000000 #/nvfs 80000002.00000000 #/prog perky$ ls -q '#A' audio, sound input and output 00000001.00000000 #A/audio bound to /dev 00000002.00000000 #A/audioctl perky$ ls -q '#C/cmd' host commands 80000004.00000000 #C/cmd/0 bound to / 00000003.00000000 #C/cmd/clone perky$ ls -q '#D' SSL, filter for sockets 00000002.00000000 #D/clone bound to /0/ssl etc. perky$ ls -q '#I' '#I/tcp' '#I/udp' IP, internet connections 80010002.00000000 #I/tcp bound to /net 80000002.00000000 #I/udp 00010003.00000000 #I/tcp/clone 00000003.00000000 #I/udp/clone perky$ ls -dq '#U' host file system 81000002.336c9483 #U bound to / perky$ ls -q '#c' console etc., bound to /dev 00000001.00000000 #c/cons console, input and output 00000002.00000000 #c/consctl console, state 00000003.00000000 #c/keyboard keyboard, uninterpreted 00000004.00000000 #c/memory memory allocation state 00000005.00000000 #c/null the void 00000006.00000000 #c/pin PIN, can be written once 00000007.00000000 #c/pointer mouse, position and buttons 00000008.00000000 #c/random random characters 00000009.00000000 #c/sysname host name (shell prompt) 0000000b.00000000 #c/time microseconds since the epoch 0000000a.00000000 #c/user user's name Вы можете увидеть последовательность команд, которые были выполнены для создания текущего пространства имен, запустив следующую команду: ns Настройка сетевой карты Для наглядной демонстрации того, как используются пространства имен и файловые серверы в повседневной работе с Inferno, рассмотрим пример настройки сетевой карты (если вы используете гостевой вариант Inferno, этого делать не потребуется, так Inferno будет использовать сетевой стек низлежащей ОС): 1. Подключаем устройство #I или #I0 к каталогу /net: bind -a '#I0' /net 2. Получаем новый сетевой интерфейс: cat /net/ipifc/clone 3. Устанавливаем связь между сетевой картой и интерфейсом: echo -n 'bind ether ether0' > /net/ipifc/0/ctl 4. Задаем интерфейсу IP адрес и маску сети: echo -n 'add 192.168.0.2 255.255.255.0' > /net/ipifc/0/ctl 5. Добавляем запись в таблицу маршрутизации и прописываем маршрут по-умолчанию echo -n 'add 0.0.0.0 0.0.0.0 192.168.0.1' > /net/iproute Все эти команды необязательно выполнять при каждом запуске ОС, в разделе Настройка будет приведен пример перманентной настройки сети, которая будет осуществляться в автоматическом режиме при каждом запуске ОС. Сетвое взаимодействие An existing namespace can be exported with styxlisten. Use it as in the following example: styxlisten 'tcp!*!styx' export / This will listen for tcp connections on the port "styx" (which is defined in /lib/ndb/common to be 6666). All connections will be served by a single invocation of export / (styxlisten expects the program to serve the styx protocol on its file descriptor 0). The program "export" simply exports the namespace starting at the parameter it is passed, the root of the file system in this case. These simple programs (they are just over 300 lines combined!) give a lot of power. Just as with mount, option -A disables authentication on the connection. mount net!www.example.org!styx target, gets file descriptor by dialing net!www.example.org!styx Категория:Руководство